home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / TURB_VIS / TCYBER25 / CYEDIT.ZIP / CYEDIT.PAS < prev   
Pascal/Delphi Source File  |  1994-10-20  |  38KB  |  1,511 lines

  1. {
  2. Turbo Vision CyberTools 2.5
  3. (C) 1994 Steve Goldsmith
  4. All Rights Reserved
  5.  
  6. CyberEdit application allows editing VGA 8X16 text mode fonts.  Uses tool bar,
  7. help system and CyberFont graphic interface.
  8.  
  9. Borland Pascal 7.x or Turbo Pascal 7.x and Turbo Vision 2.x are required to
  10. compile.
  11.  
  12. Set IDE directories to
  13.  
  14. \BP\UNITS;
  15. \BP\EXAMPLES\DOS\TVDEMO;
  16. \BP\EXAMPLES\DOS\TVFM;
  17.  
  18. These path names are BP 7.x defaults.  If you changed any of these then use
  19. the correct paths in Options|Directories...  See APP.INC for global compiler
  20. switches.
  21. }
  22.  
  23. program CyberEdit;
  24.  
  25. {$I APP.INC}
  26. {$X+}
  27.  
  28. uses
  29.  
  30.   Dos,                           {bp units}
  31.   Memory, Drivers, Objects,      {tv units}
  32.   Views, Menus, Dialogs,
  33.   App, MsgBox, StdDlg, ColorSel,
  34.   Gadgets, HelpFile,             {tvdemo units}
  35.   ViewText,                      {tvfm units}
  36.   CEHelp, CECmds,                {cybertools units}
  37.   VGA, VGACGFil, PCX,
  38.   CommDlgs, CEDlgs, TVStr;
  39.  
  40. const
  41.  
  42.   appHelpName = 'CEHELP.HLP'; {help file name}
  43.   appExeName  = 'CYEDIT.EXE'; {name used to locate .exe for older dos}
  44.   appDocName  = 'CYBER.DOC';  {doc file name}
  45.   appCfgName  = 'CYEDIT.CFG'; {config stream file name}
  46.   appCfgHeaderLen = 10;       {header used by config stream}
  47.   appCfgHeader : string[appCfgHeaderLen] = 'CYBEREDIT'#26;
  48.   appViewDocBuf = 8192;       {buffer size for viewing doc file}
  49.  
  50.   appChrWidth8  = $01;        {set app options bit to 1 to select option}
  51.   appPageMode   = $02;
  52.   app8Colors    = $04;
  53.   appScrOpts    = $07;        {mask of just screen options}
  54.   appHelpInUse  = $8000;      {used by help system}
  55.  
  56.   appGraphWinX = 32;          {x = 32*8 = 256 pixels}
  57.   appGraphWinY = 8;           {y = 8*16 = 128 pixels}
  58.   appFadeInc   = 8;           {fade in/out increment}
  59.  
  60.   CSysColor  = #$00#$00#$00;  {app palette additions for tv system stuff}
  61.   CSysPal    = #137#138#139;
  62.  
  63.   appToolCmds = [cmQuit,cmLoadFont,cmSaveFont,
  64.   cmDirChange,cmShellToDos,cmScreenOpts,cmExit,cmBarHelp];
  65.  
  66. type
  67.  
  68.   TCyberEdit = object (TApplication)
  69.     FontTable1,
  70.     FontTable2,
  71.     FirstChr,
  72.     LastChr : byte;
  73.     AppOptions,
  74.     PageOfs,
  75.     DefChrHeight : word;
  76.     ScrData : ScrOptsData;
  77.     Page : pointer;
  78.     DefFont : vgaChrTablePtr;
  79.     DacPalette : vgaPalette;
  80.     Clock : PClockView;
  81.     Heap : PHeapView;
  82.     constructor Init;
  83.     destructor Done; virtual;
  84.     procedure SetCustomScreen;
  85.     procedure FlipPage;
  86.     procedure ClearDeskTop;
  87.     procedure Idle; virtual;
  88.     procedure AboutBox;
  89.     procedure CharSelector;
  90.     procedure ToolBar;
  91.     procedure LoadFontTable (ChrData : pointer;
  92.                              ChrTable, ChrHeight :byte;
  93.                              StartChr, NumChrs : word);
  94.     function SaveFontTable (ChrTable, ChrHeight :byte;
  95.                             StartChr, NumChrs : word) : vgaChrTablePtr;
  96.     procedure RestoreDesktop (F : PathStr);
  97.     procedure SaveDeskTop (F : PathStr);
  98.     function GetPalette : PPalette; virtual;
  99.     procedure GetEvent (var Event : TEvent); virtual;
  100.     procedure HandleEvent (var Event : TEvent); virtual;
  101.     procedure InitDeskTop; virtual;
  102.     procedure InitMenuBar; virtual;
  103.     procedure InitStatusLine; virtual;
  104.     procedure OutOfMemory; virtual;
  105.     procedure LoadDesktop (var S : TStream);
  106.     procedure StoreDesktop (var S : TStream);
  107.   end;
  108.  
  109. {
  110. Initilize TV app.
  111. }
  112.  
  113. constructor TCyberEdit.Init;
  114.  
  115. var
  116.  
  117.   R :TRect;
  118.  
  119. begin
  120.   LowMemSize := 4095;   {65520 byte safety pool needed to do dos shell safely}
  121.   inherited Init;
  122.   RegisterObjects;      {register stuff for stream access}
  123.   RegisterViews;
  124.   RegisterMenus;
  125.   RegisterDialogs;
  126.   RegisterApp;
  127.   RegisterHelpFile;
  128.  
  129.   GetExtent (R);   {gadgets included with tvdemo}
  130.   R.A.Y := R.B.Y-1;
  131.   R.B.X := R.B.X-1;
  132.   R.A.X := R.B.X-8;
  133.   Heap := New (PHeapView,Init(R));
  134.   Heap^.GrowMode := gfGrowAll;
  135.   Insert (Heap);
  136.  
  137.   GetExtent (R);
  138.   R.B.Y := R.A.Y+1;
  139.   R.B.X := R.B.X-1;
  140.   R.A.X := R.B.X-8;
  141.   Clock := New (PClockView,Init (R));
  142.   Insert (Clock);
  143.  
  144.   RestoreDesktop (appCfgName);        {load config stream}
  145.   ToolBar;                            {show tool bar}
  146.   AboutBox
  147. end;
  148.  
  149. {
  150. Done TV app.
  151. }
  152.  
  153. destructor TCyberEdit.Done;
  154.  
  155. begin
  156.   if DefFont <> nil then      {dispose default font}
  157.     FreeMem (DefFont,vgaMaxChrs*DefChrHeight);
  158.   FadeOutDAC (appFadeInc);                 {fade to black}
  159.   SetVideoMode (StartUpMode); {this resets all the custom stuff with bios}
  160.   inherited Done
  161. end;
  162.  
  163. {
  164. Sets screen page if not not flipping, 8 or 16 color mode, 8 or 9 pixel width,
  165. font map, DAC palette and mouse mask.
  166. }
  167.  
  168. procedure TCyberEdit.SetCustomScreen;
  169.  
  170. begin
  171.   HideMouse;
  172.   if AppOptions and appPageMode = 0 then
  173.     SetPage (vgaPageOfsLoc[0]); {screen page 0 for non page flipping displays}
  174.   if AppOptions and app8Colors = app8Colors then
  175.     SetAttrCont (vgaAttrCPEnable,$07)  {use 8 colors}
  176.   else
  177.     SetAttrCont (vgaAttrCPEnable,$0f); {use 16 colors}
  178.   if AppOptions and appChrWidth8 = appChrWidth8 then
  179.   begin
  180.     if IsChrWidth9 then
  181.       SetChrWidth8                     {640 x 400 screen}
  182.   end
  183.   else
  184.   begin
  185.     if not IsChrWidth9 then
  186.       SetChrWidth9                     {720 x 400 screen}
  187.   end;
  188.   FontMapSelect (vgaChrTableMap1[FontTable1],
  189.   vgaChrTableMap2[FontTable2]);        {select font tables}
  190.   SetDACBlock (@DacPalette,0,256);     {set 256 color palette}
  191.   MouseTextMask ($ffff,$f700);         {set mouse mask for both fonts}
  192.   ShowMouse
  193. end;
  194.  
  195. {
  196. Copy screen page 0 to new non-visiable page and flip to new page.
  197. }
  198.  
  199. procedure TCyberEdit.FlipPage;
  200.  
  201. begin
  202.   CopyScrMem (ScreenBuffer,Page,vgaScrSize25);
  203.   SetPage (PageOfs);
  204.   if PageOfs = vgaPageOfsLoc[1] then
  205.   begin
  206.     PageOfs := vgaPageOfsLoc[2];
  207.     Page := vgaPageLoc[2]
  208.   end
  209.   else
  210.   begin
  211.     PageOfs := vgaPageOfsLoc[1];
  212.     Page := vgaPageLoc[1]
  213.   end;
  214.   WaitVertSync {wait for vga vert sync before drawing anything}
  215. end;
  216.  
  217. {
  218. Remove all closeable windows from desk top.
  219. }
  220.  
  221. procedure TCyberEdit.ClearDeskTop;
  222.  
  223. procedure CloseDlg (P : PView); far;
  224.  
  225. begin
  226.   Message (P,evCommand,cmClose,nil)
  227. end;
  228.  
  229. begin
  230.   Desktop^.ForEach (@CloseDlg)
  231. end;
  232.  
  233. {
  234. Handle app's idle time processing.
  235. }
  236.  
  237. procedure TCyberEdit.Idle;
  238.  
  239. {return true if any view on desk top is tileable}
  240.  
  241. function IsTileable (P : PView) : boolean; far;
  242.  
  243. begin
  244.   IsTileable := (P^.Options and ofTileable <> 0) and
  245.   (P^.State and sfVisible <> 0)
  246. end;
  247.  
  248. begin
  249.   inherited Idle;
  250.   Clock^.Update; {update tvdemo gadgets}
  251.   Heap^.Update;
  252.   if Desktop^.Current <> nil then              {see if anything is}
  253.   begin                                        {on the desk top}
  254.     EnableCommands ([cmCloseAll]);
  255.     if Desktop^.FirstThat (@IsTileable) <> nil then {see if any tileable}
  256.       EnableCommands ([cmTile,cmCascade])           {windows are on the}
  257.     else                                            {desk top}
  258.       DisableCommands ([cmTile,cmCascade]);
  259.   end
  260.   else
  261.     DisableCommands ([cmCloseAll,cmTile,cmCascade]);
  262.   if ((Desktop^.Current <> nil) and
  263.   (Desktop^.Current^.State and sfModal = sfModal)) or
  264.   (AppOptions and appHelpInUse = appHelpInUse) then {see if modal dialog}
  265.     DisableCommands (appToolCmds)                   {is on the desk top}
  266.   else
  267.     EnableCommands (appToolCmds);
  268.   if AppOptions and appPageMode = appPageMode then
  269.     FlipPage; {if page mode is enabled then flip page each idle cycle}
  270. end;
  271.  
  272. {
  273. Display info about app.
  274. }
  275.  
  276. procedure TCyberEdit.AboutBox;
  277.  
  278. begin
  279.   HelpCtx := hcAbout;
  280.   MessageBox(
  281.     #3'Turbo Vision CyberTools 2.5'#13+
  282.     #3'(C) 1994 Steve Goldsmith'#13+
  283. {$IFDEF DPMI}
  284.     #3'CyberEdit DPMI',
  285. {$ELSE}
  286.     #3'CyberEdit REAL',
  287. {$ENDIF}
  288.     nil, mfInformation or mfOKButton);
  289.   HelpCtx := hcNoContext
  290. end;
  291.  
  292. {
  293. Char selector window selects which char to edit.
  294. }
  295.  
  296. procedure TCyberEdit.CharSelector;
  297.  
  298. var
  299.  
  300.   D : PChrSetEditDlg;
  301.  
  302. function IsThere (P : PView) : Boolean; far;
  303.  
  304. begin {see if view is a chr set dialog}
  305.   IsThere := (TypeOf (P^) = TypeOf (TChrSetEditDlg))
  306. end;
  307.  
  308. begin
  309.   PView (D) := Desktop^.FirstThat (@IsThere);
  310.   if D <> nil then {if on desk top then update title and focus}
  311.   begin
  312.     if D^.Title <> nil then
  313.       DisposeStr (D^.Title);
  314.     D^.Title := NewStr ('Font Table '+IntToStr (FontTable2));
  315.     D^.Frame^.DrawView;
  316.     D^.MakeFirst
  317.   end
  318.   else  {if not on desk top the create new window}
  319.   begin
  320.     D := New(PChrSetEditDlg,Init ('Font Table '+IntToStr (FontTable2)));
  321.     D^.HelpCtx := hcSelectorWindow;
  322.     InsertWindow (D)
  323.   end
  324. end;
  325.  
  326. {
  327. Tool bar with graphic icons.
  328. }
  329.  
  330. procedure TCyberEdit.ToolBar;
  331.  
  332. var
  333.  
  334.   D : PToolBarDlg;
  335.  
  336. function IsThere (P : PView) : Boolean; far;
  337.  
  338. begin {see if view is a tool bar}
  339.   IsThere := (TypeOf (P^) = TypeOf (TToolBarDlg))
  340. end;
  341.  
  342. begin
  343.   PView (D) := Desktop^.FirstThat (@IsThere);
  344.   if D = nil then {if tool bar is not on desk top then create}
  345.   begin
  346.     D := New (PToolBarDlg,Init (128,3,7,cmLoadFont));
  347.     D^.HelpCtx := hcToolBar;
  348.     InsertWindow (D)
  349.   end
  350.   else {if tool bar is on desk top then focus}
  351.     D^.MakeFirst
  352. end;
  353.  
  354. {
  355. Load font table from system RAM.
  356. }
  357.  
  358. procedure TCyberEdit.LoadFontTable (ChrData : pointer;
  359.                                     ChrTable, ChrHeight :byte;
  360.                                     StartChr, NumChrs : word);
  361.  
  362. begin
  363.   HideMouse;
  364.   AccessFontMem;
  365.   SetRamTable (StartChr,NumChrs,ChrHeight,ChrData,vgaChrTableLoc[ChrTable]);
  366.   AccessScreenMem;
  367.   ShowMouse
  368. end;
  369.  
  370. {
  371. Save font table from video RAM.
  372. }
  373.  
  374. function TCyberEdit.SaveFontTable (ChrTable, ChrHeight :byte;
  375.                                       StartChr, NumChrs : word) : vgaChrTablePtr;
  376.  
  377. begin
  378.   HideMouse;
  379.   AccessFontMem;
  380.   SaveFontTable :=
  381.   GetRamTable (StartChr,NumChrs,ChrHeight,vgaChrTableLoc [ChrTable]);
  382.   AccessScreenMem;
  383.   ShowMouse
  384. end;
  385.  
  386. {
  387. Restore desk top stream.
  388. }
  389.  
  390. procedure TCyberEdit.RestoreDesktop (F : PathStr);
  391.  
  392. var
  393.  
  394.   I : byte;
  395.   S : PStream;
  396.   Signature : string[appCfgHeaderLen];
  397.  
  398. begin
  399.   S := New (PBufStream,Init (F,stOpenRead,1024));
  400.   if LowMemory then OutOfMemory
  401.   else
  402.     if S^.Status <> stOk then
  403.     begin
  404.       MessageBox (#3'Unable to open file.',nil,mfOkButton+mfError)
  405.     end
  406.     else
  407.     begin
  408.       Signature[0] := Char (appCfgHeaderLen);
  409.       S^.Read (Signature[1],appCfgHeaderLen);
  410.       if Signature = appCfgHeader then {see if signature is right}
  411.       begin
  412.         S^.Read (AppOptions,SizeOf (AppOptions)); {read data from stream}
  413.         S^.Read (FontTable1,SizeOf (FontTable1));
  414.         S^.Read (FontTable2,SizeOf (FontTable2));
  415.         S^.Read (FirstChr,SizeOf (FirstChr));
  416.         S^.Read (LastChr,SizeOf (LastChr));
  417.         S^.Read (DacPalette,SizeOf (DacPalette));
  418.  
  419.         if DefFont = nil then
  420.           DefFont := MemAlloc (DefChrHeight*vgaMaxChrs);
  421.         HideMouse; {no screen writes during font mem access}
  422.         AccessFontMem;
  423.         for I := 0 to 7 do
  424.         begin
  425.           S^.Read (DefFont^,DefChrHeight*vgaMaxChrs);
  426.           SetRamTable (0,vgaMaxChrs,DefChrHeight,DefFont,vgaChrTableLoc[I])
  427.         end;
  428.         AccessScreenMem;
  429.         ShowMouse;
  430.  
  431.         LoadDesktop (S^);
  432.         LoadIndexes (S^);
  433.         ShadowAttr := GetColor (137);   {tv shadow color}
  434.         SysColorAttr := (GetColor (138) shl 8) or
  435.         GetColor (138);                 {tv system error color}
  436.         ErrorAttr := GetColor (139);    {tv palette index error color}
  437.         Application^.ReDraw;            {draw app with new config}
  438.         if DefFont <> nil then
  439.         begin
  440.           FreeMem (DefFont,DefChrHeight*vgaMaxChrs);
  441.           DefFont := SaveFontTable (FontTable1,DefChrHeight,0,vgaMaxChrs)
  442.         end;
  443.         SetCustomScreen;
  444.         CharSelector;
  445.         if S^.Status <> stOk then
  446.           MessageBox (#3'Stream error.',nil,mfOkButton+mfError);
  447.       end
  448.       else
  449.         MessageBox (#3'Invalid configuration format.',nil,mfOkButton+mfError)
  450.     end;
  451.   Dispose (S,Done)
  452. end;
  453.  
  454. {
  455. Save desk top stream.
  456. }
  457.  
  458. procedure TCyberEdit.SaveDesktop (F : PathStr);
  459.  
  460. var
  461.  
  462.   I : byte;
  463.   CfgFile : File;
  464.   S : PStream;
  465.   SFont : vgaChrTablePtr;
  466.  
  467. begin
  468.   S := New(PBufStream,Init (F,stCreate,1024));
  469.   if not LowMemory and (S^.Status = stOk) then
  470.   begin
  471.     S^.Write (appCfgHeader[1],appCfgHeaderLen); {write stream data}
  472.     S^.Write (AppOptions,SizeOf (AppOptions));
  473.     S^.Write (FontTable1,SizeOf (FontTable1));
  474.     S^.Write (FontTable2,SizeOf (FontTable2));
  475.     S^.Write (FirstChr,SizeOf (FirstChr));
  476.     S^.Write (LastChr,SizeOf (LastChr));
  477.     GetDACBlock (@DacPalette,0,256);
  478.     S^.Write(DacPalette,SizeOf (DacPalette));
  479.  
  480.     HideMouse; {no screen write during font mem access}
  481.     AccessFontMem;
  482.     for I := 0 to 7 do {save all 8 vga font tables}
  483.     begin
  484.       SFont := GetRamTable (0,vgaMaxChrs,DefChrHeight,vgaChrTableLoc[I]);
  485.       S^.Write (SFont^,DefChrHeight*vgaMaxChrs);
  486.       if SFont <> nil then
  487.         FreeMem (SFont,DefChrHeight*vgaMaxChrs)
  488.     end;
  489.     AccessScreenMem;
  490.     ShowMouse;
  491.  
  492.     StoreDesktop (S^);
  493.     StoreIndexes (S^);
  494.     if S^.Status <> stOk then
  495.     begin {if stream error then delete file}
  496.       MessageBox (#3'Could not create stream.',nil,mfOkButton+mfError);
  497.       Dispose (S,Done);
  498.       Assign (CfgFile,F);
  499.       {$I-} Erase (CfgFile) {$I+};
  500.       Exit
  501.     end
  502.   end;
  503.   Dispose (S,Done)
  504. end;
  505.  
  506. {
  507. Get custom app palette.
  508. }
  509.  
  510. function TCyberEdit.GetPalette: PPalette;
  511.  
  512. const
  513.  
  514.   CNewColor = CAppColor+CHelpColor+CCharColor+CSysColor;
  515.   CNewBlackWhite = CAppBlackWhite+CHelpBlackWhite+CCharColor+CSysColor;
  516.   CNewMonochrome = CAppMonochrome+CHelpMonochrome+CCharColor+CSysColor;
  517.   P: array[apColor..apMonochrome] of string[Length (CNewColor)] =
  518.   (CNewColor, CNewBlackWhite, CNewMonochrome);
  519.  
  520. begin {add additional entries to the normal application palettes}
  521.   GetPalette := @P[AppPalette]
  522. end;
  523.  
  524. {
  525. Intercept cmHelp and cmBarHelp to display help even when views are in modal
  526. state.
  527. }
  528.  
  529. procedure TCyberEdit.GetEvent (var Event : TEvent);
  530.  
  531. function CalcHelpName : PathStr;
  532.  
  533. var
  534.  
  535.   EXEName : PathStr;
  536.   Dir : DirStr;
  537.   Name : NameStr;
  538.   Ext : ExtStr;
  539.  
  540. begin
  541.   if Lo (DosVersion) >= 3 then
  542.     EXEName := ParamStr (0)
  543.   else
  544.     EXEName := FSearch (appExeName, GetEnv ('PATH'));
  545.   FSplit (EXEName, Dir, Name, Ext);
  546.   if Dir[Length (Dir)] = '\' then
  547.     Dec (Dir[0]);
  548.   CalcHelpName := FSearch (appHelpName, Dir)
  549. end;
  550.  
  551. var
  552.  
  553.   W : PWindow;
  554.   HFile : PHelpFile;
  555.   HelpStrm : PDosStream;
  556.  
  557. begin
  558.   inherited GetEvent (Event);
  559.   if (Event.What = evCommand) and
  560.   ((Event.Command = cmHelp) or (Event.Command = cmBarHelp)) and
  561.   (AppOptions and appHelpInUse = 0) then
  562.   begin
  563.     AppOptions := AppOptions or appHelpInUse; {help's in use}
  564.     HelpStrm := New (PDosStream, Init (CalcHelpName, stOpenRead));
  565.     HFile := New (PHelpFile, Init (HelpStrm));
  566.     if HelpStrm^.Status <> stOk then
  567.     begin
  568.       MessageBox (#3'Could not open help file.', nil, mfError + mfOkButton);
  569.       Dispose (HFile, Done);
  570.     end
  571.     else
  572.     begin
  573.       if Event.Command = cmHelp then
  574.         W := New (PHelpWindow,Init (HFile,GetHelpCtx))
  575.       else                                  {cmBarHelp displays help topics}
  576.         W := New (PHelpWindow,Init (HFile,hcNoContext));
  577.       if ValidView (W) <> nil then
  578.       begin
  579.         DisableCommands ([cmHelp]);
  580.         ExecView (W);
  581.         Dispose (W, Done);
  582.         EnableCommands ([cmHelp])
  583.       end
  584.     end;
  585.     ClearEvent (Event);
  586.     AppOptions := AppOptions and not appHelpInUse
  587.   end
  588. end;
  589.  
  590. {
  591. Process app events.
  592. }
  593.  
  594. procedure TCyberEdit.HandleEvent (var Event: TEvent);
  595.  
  596. {
  597. Restore default font loaded by config.
  598. }
  599.  
  600. procedure RestoreDefFont;
  601.  
  602. begin
  603.   if (DefFont <> nil) and
  604.   (DefChrHeight = BiosGetChrHeight) then
  605.     LoadFontTable (DefFont,FontTable1,DefChrHeight,0,vgaMaxChrs)
  606. end;
  607.  
  608. {
  609. Tree window.
  610. }
  611.  
  612. procedure TreeWindow (T : string; FMask : PathStr; ACmd : word);
  613.  
  614. var
  615.  
  616.   W : PDirWindow;
  617.   Drive : PathStr;
  618.  
  619. begin
  620.   GetDir (0,Drive);
  621.   W := New (PDirWindow,Init (T,Drive,FMask,ACmd));
  622.   W^.HelpCtx := hcTreeWindow;
  623.   InsertWindow (W)
  624. end;
  625.  
  626. {
  627. Return focused file name from dir tree window.  If the extension param is not
  628. null then that extension is used.
  629. }
  630.  
  631. function TreeFileName (TW : PDirWindow; EStr : PathStr; ReadFlag : boolean) : PathStr;
  632.  
  633. var
  634.  
  635.   F : file;
  636.   FName : PathStr;
  637.  
  638. begin
  639.   FName := UpCaseStr (TW^.FocDirName+TW^.NameLine^.Data^);
  640.   if (EStr <> '') and (FName[byte (FName[0])] <> '\') then {force extension}
  641.     FName := AddExtStr (FName,EStr);
  642.   if ReadFlag then
  643.     TreeFileName := FName
  644.   else
  645.   begin
  646.     Assign (F,FName);
  647.     {$I-} Reset (F); {$I+}
  648.     if IoResult = 0 then {see if file exists before writes}
  649.     begin
  650.       {$I-} Close (F); {$I+}
  651.       if MessageBox (FName+' already exists.  Erase and continue?',
  652.       nil,mfConfirmation or mfYesNoCancel) = cmYes then
  653.         TreeFileName := FName
  654.       else
  655.         TreeFileName := ''
  656.     end
  657.     else
  658.       TreeFileName := FName {doesn't exist, so return name}
  659.   end
  660. end;
  661.  
  662. {
  663. Load CGF file and store in table.
  664. }
  665.  
  666. procedure LoadChrFile (F : PathStr; ChrTbl : byte);
  667.  
  668. var
  669.  
  670.   ChrFile : TChrGenFile;
  671.  
  672. begin
  673.   ChrFile.Init;
  674.   ChrFile.OpenRead (F);
  675.   if (ChrFile.IoError = 0) and
  676.   (ChrFile.Header.Height = DefChrHeight) then
  677.   begin
  678.     ChrFile.ReadChrTable;
  679.     LoadFontTable (
  680.     ChrFile.ChrTablePtr,ChrTbl,ChrFile.Header.Height,
  681.     ChrFile.Header.StartChr,ChrFile.Header.TotalChrs)
  682.   end
  683.   else
  684.     MessageBox (#3'Problem reading font file.',nil,mfOkButton+mfError);
  685.   ChrFile.FreeChrTable;
  686.   ChrFile.Done
  687. end;
  688.  
  689. {
  690. Save CGF file from table.
  691. }
  692.  
  693. procedure SaveChrFile (F : PathStr);
  694.  
  695. var
  696.  
  697.   ChrFile : TChrGenFile;
  698.  
  699. begin
  700.   ChrFile.Init;
  701.   HideMouse;
  702.   AccessFontMem;
  703.   ChrFile.GetFontTable (FontTable2,
  704.   FirstChr,(LastChr-FirstChr)+1,DefChrHeight);
  705.   AccessScreenMem;
  706.   ShowMouse;
  707.   ChrFile.OpenWrite (F);
  708.   if ChrFile.IoError = 0 then
  709.     ChrFile.WriteChrTable
  710.   else
  711.     MessageBox (#3'Problem writing font file.',nil,mfOkButton+mfError);
  712.   ChrFile.FreeChrTable;
  713.   ChrFile.Done
  714. end;
  715.  
  716. {
  717. Load .CGF file.
  718. }
  719.  
  720. procedure LoadFontFile (TW : PDirWindow);
  721.  
  722. var
  723.  
  724.   F : PathStr;
  725.  
  726. begin
  727.   F := TreeFileName (TW,'CGF',true);
  728.   if F <> '' then
  729.     LoadChrFile (F,FontTable2)
  730. end;
  731.  
  732. {
  733. Save .CGF file.
  734. }
  735.  
  736. procedure SaveFontFile (TW : PDirWindow);
  737.  
  738. var
  739.  
  740.   F : PathStr;
  741.  
  742. begin
  743.   F := TreeFileName (TW,'CGF',false);
  744.   if F <> '' then
  745.     SaveChrFile (F)
  746. end;
  747.  
  748. {
  749. Decode and view 2 color PCX file up to 640 X 480.  Actual viewing area is
  750. determined by graphics window size.
  751. }
  752.  
  753. procedure LoadPCXFile (TW : PDirWindow);
  754.  
  755. var
  756.  
  757.   F : PathStr;
  758.   Decode : TPCXToChrTable;
  759.  
  760. begin
  761.   F := TreeFileName (TW,'PCX',true);
  762.   if F <> '' then
  763.   begin
  764.     HideMouse; {no screen writes during font mem access}
  765.     Decode.Init (F,appGraphWinX,appGraphWinY,
  766.     DefChrHeight,vgaChrTableLoc[FontTable2]);
  767.     ShowMouse;
  768.     if Decode.ReadError <> 0 then
  769.       MessageBox (#3'Problem reading PCX file.',nil,mfOkButton+mfError);
  770.     Decode.Done
  771.   end
  772. end;
  773.  
  774. {
  775. Encode graphics window and save as 2 color PCX file.
  776. }
  777.  
  778. procedure SavePCXFile (TW : PDirWindow);
  779.  
  780. var
  781.  
  782.   F : PathStr;
  783.   Encode : TChrTableToPCX;
  784.  
  785. begin
  786.   F := TreeFileName (TW,'PCX',false);
  787.   if F <> '' then
  788.   begin
  789.     HideMouse; {no screen writes during font mem access}
  790.     Encode.Init (F,appGraphWinX,appGraphWinY,
  791.     DefChrHeight,vgaChrTableLoc[FontTable2]);
  792.     ShowMouse;
  793.     if Encode.WriteError <> 0 then
  794.       MessageBox (#3'Problem writing PCX file.',nil,mfOkButton+mfError);
  795.     Encode.Done
  796.   end
  797. end;
  798.  
  799. {
  800. Change DOS directory.
  801. }
  802.  
  803. procedure ChangeDir;
  804.  
  805. var
  806.  
  807.   D: PChDirDialog;
  808.  
  809. begin
  810.   D := New (PChDirDialog,Init (cdNormal,101));
  811.   D^.HelpCtx := hcChDirDialog;
  812.   ExecuteDialog (D,nil)
  813. end;
  814.  
  815. {
  816. Shell to DOS and preserve font 1 and 2 tables, DAC palette and screen
  817. settings.
  818. }
  819.  
  820. procedure ShellToDos;
  821.  
  822. var
  823.  
  824.   SaveFont1,
  825.   SaveFont2 : vgaChrTablePtr;
  826.  
  827. begin
  828.   SaveFont1 := SaveFontTable (FontTable1,
  829.   DefChrHeight,0,vgaMaxChrs); {save current font 1}
  830.   SaveFont2 :=
  831.   SaveFontTable (FontTable2,
  832.   DefChrHeight,0,vgaMaxChrs); {save current font 2}
  833.   if (not LowMemory) and
  834.   (SaveFont1 <> nil) and
  835.   (SaveFont2 <> nil) then
  836.   begin
  837.     SetVideoMode (StartUpMode);  {reset custom setup using bios}
  838.     DosShell
  839.   end
  840.   else
  841.     OutOfMemory;
  842.   if SaveFont1 <> nil then     {restore font 1 and 2 tables and free mem}
  843.   begin
  844.     LoadFontTable (SaveFont1,FontTable1,DefChrHeight,0,vgaMaxChrs);
  845.     FreeMem (SaveFont1,DefChrHeight*vgaMaxChrs)
  846.   end;
  847.   if SaveFont2 <> nil then
  848.   begin
  849.     LoadFontTable (SaveFont2,FontTable2,DefChrHeight,0,vgaMaxChrs);
  850.     FreeMem (SaveFont2,DefChrHeight*vgaMaxChrs)
  851.   end;
  852.   SetCustomScreen; {reset screen mode and dac palette}
  853.   ShowMouse
  854. end;
  855.  
  856. {
  857. View any text file.
  858. }
  859.  
  860. procedure ViewTextFile (FileName : PathStr);
  861.  
  862. var
  863.  
  864.   T : PTextWindow;
  865.   R : TRect;
  866.  
  867. begin
  868.   GetExtent (R);
  869.   R.Grow (-5,-4);
  870.   T := New (PTextWindow, Init (R,FileName));
  871.   T^.Options := T^.Options or ofCentered;
  872.   T^.Palette := wpGrayWindow;
  873.   T^.HelpCtx := hcViewDoc;
  874.   InsertWindow (T)
  875. end;
  876.  
  877. {
  878. Screen options dialog.
  879. }
  880.  
  881. procedure ScreenOptions;
  882.  
  883. var
  884.  
  885.   D : PScrOptsDlg;
  886.  
  887. begin
  888.   with ScrData do
  889.   begin
  890.     SMode := AppOptions and appScrOpts; {use only screen options}
  891.     FontMapVal (GetSeqCont (vgaSeqChrMapSel),byte (FntTbl1),byte (FntTbl2));
  892.     FChr := IntToStr (FirstChr);
  893.     LChr := IntToStr (LastChr);
  894.     D := New (PScrOptsDlg,Init);
  895.     D^.Options := D^.Options or ofCentered;
  896.     D^.HelpCtx := hcScreenDialog;
  897.     if ExecuteDialog (D,@ScrData) <> cmCancel then
  898.     begin
  899.       AppOptions := (AppOptions and not appScrOpts)
  900.       or SMode; {clear all scr opts bits and set bits returned from dialog}
  901.       FontTable1 := FntTbl1;
  902.       FontTable2 := FntTbl2;
  903.       FirstChr := StrToInt (FChr);
  904.       LastChr := StrToInt (LChr);
  905.       SetCustomScreen; {set screen with new settings}
  906.       CharSelector
  907.     end
  908.   end
  909. end;
  910.  
  911. procedure Colors;
  912.  
  913. {custom color items}
  914. function DlgColorItems (Palette: Word; const Next: PColorItem) : PColorItem;
  915.  
  916. const
  917.  
  918.   COffset : array[dpBlueDialog..dpGrayDialog] of Byte = (64, 96, 32);
  919.  
  920. var
  921.  
  922.   Offset : Byte;
  923.  
  924. begin
  925.   Offset := COffset[Palette];
  926.   DlgColorItems :=
  927.     ColorItem ('Frame passive',     Offset,
  928.     ColorItem ('Frame active',      Offset + 1,
  929.     ColorItem ('Frame icons',       Offset + 2,
  930.     ColorItem ('Scroll bar page',   Offset + 3,
  931.     ColorItem ('Scroll bar icons',  Offset + 4,
  932.     ColorItem ('Static text',       Offset + 5,
  933.  
  934.     ColorItem ('Label normal',      Offset + 6,
  935.     ColorItem ('Label selected',    Offset + 7,
  936.     ColorItem ('Label shortcut',    Offset + 8,
  937.  
  938.     ColorItem ('Button normal',     Offset + 9,
  939.     ColorItem ('Button default',    Offset + 10,
  940.     ColorItem ('Button selected',   Offset + 11,
  941.     ColorItem ('Button disabled',   Offset + 12,
  942.     ColorItem ('Button shortcut',   Offset + 13,
  943.     ColorItem ('Button shadow',     Offset + 14,
  944.  
  945.     ColorItem ('Cluster normal',    Offset + 15,
  946.     ColorItem ('Cluster selected',  Offset + 16,
  947.     ColorItem ('Cluster shortcut',  Offset + 17,
  948.  
  949.     ColorItem ('Input normal',      Offset + 18,
  950.     ColorItem ('Input selected',    Offset + 19,
  951.     ColorItem ('Input arrow',       Offset + 20,
  952.  
  953.     ColorItem ('History button',    Offset + 21,
  954.     ColorItem ('History sides',     Offset + 22,
  955.     ColorItem ('History bar page',  Offset + 23,
  956.     ColorItem ('History bar icons', Offset + 24,
  957.  
  958.     ColorItem ('List normal',       Offset + 25,
  959.     ColorItem ('List focused',      Offset + 26,
  960.     ColorItem ('List selected',     Offset + 27,
  961.     ColorItem ('List divider',      Offset + 28,
  962.  
  963.     ColorItem('Information pane',  Offset + 29,
  964.     Next))))))))))))))))))))))))))))));
  965. end;
  966.  
  967. function HelpColorItems(const Next: PColorItem): PColorItem;
  968.  
  969. begin
  970.   HelpColorItems :=
  971.     ColorItem ('Frame passive',     128,
  972.     ColorItem ('Frame active',      129,
  973.     ColorItem ('Frame icons',       130,
  974.     ColorItem ('Scroll bar page',   131,
  975.     ColorItem ('Scroll bar icons',  132,
  976.     ColorItem ('Normal text',       133,
  977.     ColorItem ('Key word',          134,
  978.     ColorItem ('Select key word',   135,
  979.     Next))))))))
  980. end;
  981.  
  982. function CharColorItems (const Next: PColorItem) : PColorItem;
  983.  
  984. begin
  985.   CharColorItems :=
  986.     ColorItem ('Character window', 136,
  987.     Next)
  988. end;
  989.  
  990. function SysColorItems (const Next: PColorItem) : PColorItem;
  991.  
  992. begin
  993.   SysColorItems :=
  994.     ColorItem ('Shadow',       137,
  995.     ColorItem ('System error', 138,
  996.     ColorItem ('Index error',  139,
  997.     Next)))
  998. end;
  999.  
  1000. var
  1001.  
  1002.   D : PColorDialog;
  1003.  
  1004. begin
  1005.   D := New (PColorDialog,Init ('',
  1006.   ColorGroup ('Desktop',     DesktopColorItems(nil),
  1007.   ColorGroup ('Menus',       MenuColorItems(nil),
  1008.   ColorGroup ('Gray Windows',WindowColorItems(wpGrayWindow,nil),
  1009.   ColorGroup ('Blue Windows',WindowColorItems(wpBlueWindow,nil),
  1010.   ColorGroup ('Cyan Windows',WindowColorItems(wpCyanWindow,nil),
  1011.   ColorGroup ('Gray Dialogs',DlgColorItems(dpGrayDialog,nil),
  1012.   ColorGroup ('Blue Dialogs',DlgColorItems(dpBlueDialog,nil),
  1013.   ColorGroup ('Cyan Dialogs',DlgColorItems(dpCyanDialog,nil),
  1014.   ColorGroup ('Help',        HelpColorItems(nil),
  1015.   ColorGroup ('Selector',  CharColorItems(nil),
  1016.   ColorGroup ('System',      SysColorItems(nil),
  1017.   nil)))))))))))));
  1018.   D^.HelpCtx := hcColorDialog;
  1019.   if ExecuteDialog (D,Application^.GetPalette) <> cmCancel then
  1020.   begin
  1021.     DoneMemory; {dispose all group buffers}
  1022.     ReDraw;     {redraw application with new palette}
  1023.     ShadowAttr := GetColor (137);   {tv shadow color}
  1024.     SysColorAttr := (GetColor (138) shl 8) or
  1025.     GetColor (138);                 {tv system error color}
  1026.     ErrorAttr := GetColor (139)     {tv palette index error color}
  1027.   end
  1028. end;
  1029.  
  1030. {
  1031. Adjust 16 text colors at DAC level.
  1032. }
  1033.  
  1034. procedure AdjustPalette;
  1035.  
  1036. var
  1037.  
  1038.   D : PPalDlg;
  1039.  
  1040. begin
  1041.   D := New (PPalDlg,Init);
  1042.   D^.Options := D^.Options or ofCentered;
  1043.   D^.HelpCtx := hcPaletteDialog;
  1044.   if ExecuteDialog (D,nil) <> cmCancel then
  1045.     GetDACBlock (@DacPalette,0,256)
  1046. end;
  1047.  
  1048. {
  1049. Load .CFG file.
  1050. }
  1051.  
  1052. procedure LoadConfigFile (TW : PDirWindow);
  1053.  
  1054. var
  1055.  
  1056.   F : PathStr;
  1057.  
  1058. begin
  1059.   F := TreeFileName (TW,'CFG',true);
  1060.   if F <> '' then
  1061.     RestoreDeskTop (F)
  1062. end;
  1063.  
  1064. {
  1065. Save .CFG file.
  1066. }
  1067.  
  1068. procedure SaveConfigFile (TW : PDirWindow);
  1069.  
  1070. var
  1071.  
  1072.   F : PathStr;
  1073.  
  1074. begin
  1075.   F := TreeFileName (TW,'CFG',false);
  1076.   if F <> '' then
  1077.     SaveDeskTop (F)
  1078. end;
  1079.  
  1080. {
  1081. Create character editor.
  1082. }
  1083.  
  1084. procedure CharEdit (D : PChrSetEditDlg);
  1085.  
  1086. var
  1087.  
  1088.   I : integer;
  1089.   P : PChrEditDlg;
  1090.  
  1091. begin
  1092.   P := New(PChrEditDlg,Init (D^.ChrView^.ChrVal,FontTable2));
  1093.   HideMouse;
  1094.   AccessFontMem;
  1095.   for I := 0 to DefChrHeight-1 do {copy char image into editor's font array}
  1096.     P^.ChrEditor^.FontArray [I] :=
  1097.     vgaChrTablePtr (vgaChrTableLoc[FontTable2])^
  1098.     [D^.ChrView^.ChrVal*vgaMaxChrHeight+I];
  1099.   AccessScreenMem;
  1100.   ShowMouse;
  1101.   P^.HelpCtx := hcCharEditor;
  1102.   InsertWindow (P);
  1103. end;
  1104.  
  1105. {
  1106. Clear all bits to 0.
  1107. }
  1108.  
  1109. procedure CharDelete (D : PChrSetEditDlg);
  1110.  
  1111. var
  1112.  
  1113.   I : integer;
  1114.  
  1115. begin
  1116.   HideMouse;
  1117.   AccessFontMem;
  1118.   for I := 0 to DefChrHeight-1 do {clear char in font mem}
  1119.     vgaChrTablePtr (vgaChrTableLoc[FontTable2])^
  1120.     [D^.ChrView^.ChrVal*vgaMaxChrHeight+I] := 0;
  1121.   AccessScreenMem;
  1122.   ShowMouse
  1123. end;
  1124.  
  1125. {
  1126. Paste char from buffer.
  1127. }
  1128.  
  1129. procedure CharPaste (D : PChrSetEditDlg);
  1130.  
  1131. var
  1132.  
  1133.   I : integer;
  1134.  
  1135. begin
  1136.   HideMouse;
  1137.   AccessFontMem;
  1138.   for I := 0 to DefChrHeight-1 do {copy char from paste buffer}
  1139.     vgaChrTablePtr (vgaChrTableLoc[FontTable2])^
  1140.     [D^.ChrView^.ChrVal*vgaMaxChrHeight+I] :=
  1141.     vgaChrTablePtr (vgaChrTableLoc[FontTable2])^
  1142.     [D^.PasteChr*vgaMaxChrHeight+I];
  1143.   AccessScreenMem;
  1144.   ShowMouse
  1145. end;
  1146.  
  1147. {
  1148. Update font RAM from editor image.
  1149. }
  1150.  
  1151. procedure CharChanged (D : PChrEditDlg);
  1152.  
  1153. var
  1154.  
  1155.   I : integer;
  1156.  
  1157. begin
  1158.   HideMouse;
  1159.   AccessFontMem;
  1160.   for I := 0 to DefChrHeight-1 do {copy editor's image to font table}
  1161.     vgaChrTablePtr (vgaChrTableLoc[D^.FontTable])^[D^.ChrVal*vgaMaxChrHeight+I] :=
  1162.     D^.ChrEditor^.FontArray [I];
  1163.   AccessScreenMem;
  1164.   ShowMouse
  1165. end;
  1166.  
  1167. {
  1168. Reverse bits in char.
  1169. }
  1170.  
  1171. procedure CharInvert (D : PChrSetEditDlg);
  1172.  
  1173. var
  1174.  
  1175.   I : integer;
  1176.  
  1177. begin
  1178.   HideMouse;
  1179.   AccessFontMem;
  1180.   for I := 0 to DefChrHeight-1 do
  1181.     vgaChrTablePtr (vgaChrTableLoc[FontTable2])^
  1182.     [D^.ChrView^.ChrVal*vgaMaxChrHeight+I] :=
  1183.     vgaChrTablePtr (vgaChrTableLoc[FontTable2])^
  1184.     [D^.ChrView^.ChrVal*vgaMaxChrHeight+I] xor $ff;
  1185.   AccessScreenMem;
  1186.   ShowMouse
  1187. end;
  1188.  
  1189. {
  1190. Shift left 1 bit.
  1191. }
  1192.  
  1193. procedure CharLeft (D : PChrSetEditDlg);
  1194.  
  1195. var
  1196.  
  1197.   I : integer;
  1198.  
  1199. begin
  1200.   HideMouse;
  1201.   AccessFontMem;
  1202.   for I := 0 to DefChrHeight-1 do
  1203.     vgaChrTablePtr (vgaChrTableLoc[FontTable2])^
  1204.     [D^.ChrView^.ChrVal*vgaMaxChrHeight+I] :=
  1205.     vgaChrTablePtr (vgaChrTableLoc[FontTable2])^
  1206.     [D^.ChrView^.ChrVal*vgaMaxChrHeight+I] shl 1;
  1207.   AccessScreenMem;
  1208.   ShowMouse
  1209. end;
  1210.  
  1211. {
  1212. Shift right 1 bit.
  1213. }
  1214.  
  1215. procedure CharRight (D : PChrSetEditDlg);
  1216.  
  1217. var
  1218.  
  1219.   I : integer;
  1220.  
  1221. begin
  1222.   HideMouse;
  1223.   AccessFontMem;
  1224.   for I := 0 to DefChrHeight-1 do
  1225.     vgaChrTablePtr (vgaChrTableLoc[FontTable2])^
  1226.     [D^.ChrView^.ChrVal*vgaMaxChrHeight+I] :=
  1227.     vgaChrTablePtr (vgaChrTableLoc[FontTable2])^
  1228.     [D^.ChrView^.ChrVal*vgaMaxChrHeight+I] shr 1;
  1229.   AccessScreenMem;
  1230.   ShowMouse
  1231. end;
  1232.  
  1233. {
  1234. Shift up 1 bit.
  1235. }
  1236.  
  1237. procedure CharUp (D : PChrSetEditDlg);
  1238.  
  1239. var
  1240.  
  1241.   I : integer;
  1242.  
  1243. begin
  1244.   HideMouse;
  1245.   AccessFontMem;
  1246.   for I := 0 to DefChrHeight-2 do
  1247.     vgaChrTablePtr (vgaChrTableLoc[FontTable2])^
  1248.     [D^.ChrView^.ChrVal*vgaMaxChrHeight+I] :=
  1249.     vgaChrTablePtr (vgaChrTableLoc[FontTable2])^
  1250.     [D^.ChrView^.ChrVal*vgaMaxChrHeight+I+1];
  1251.   vgaChrTablePtr (vgaChrTableLoc[FontTable2])^
  1252.   [D^.ChrView^.ChrVal*vgaMaxChrHeight+DefChrHeight-1] := 0;
  1253.   AccessScreenMem;
  1254.   ShowMouse
  1255. end;
  1256.  
  1257. {
  1258. Shift down 1 bit.
  1259. }
  1260.  
  1261. procedure CharDown (D : PChrSetEditDlg);
  1262.  
  1263. var
  1264.  
  1265.   I : integer;
  1266.  
  1267. begin
  1268.   HideMouse;
  1269.   AccessFontMem;
  1270.   for I := DefChrHeight-1 downto 1 do
  1271.     vgaChrTablePtr (vgaChrTableLoc[FontTable2])^
  1272.     [D^.ChrView^.ChrVal*vgaMaxChrHeight+I] :=
  1273.     vgaChrTablePtr (vgaChrTableLoc[FontTable2])^
  1274.     [D^.ChrView^.ChrVal*vgaMaxChrHeight+I-1];
  1275.   vgaChrTablePtr (vgaChrTableLoc[FontTable2])^
  1276.   [D^.ChrView^.ChrVal*vgaMaxChrHeight] := 0;
  1277.   AccessScreenMem;
  1278.   ShowMouse
  1279. end;
  1280.  
  1281. {
  1282. Force all oftileable windows to top.
  1283. }
  1284.  
  1285. procedure TileableOnTop (P : PView); far;
  1286.  
  1287. begin
  1288.   if (P^.Options and ofTileable = ofTileable) then
  1289.     P^.MakeFirst
  1290. end;
  1291.  
  1292. begin
  1293.   if Event.What = evCommand then
  1294.     case Event.Command of
  1295.       cmCascade : Desktop^.ForEach (@TileableOnTop);
  1296.       cmTile    : Desktop^.ForEach (@TileableOnTop);
  1297.       cmExit    : Event.Command := cmQuit
  1298.     end;
  1299.   inherited HandleEvent (Event);
  1300.   case Event.What of
  1301.     evCommand:
  1302.     begin
  1303.       case Event.Command of {process commands}
  1304.         cmLoadFont     : TreeWindow ('Load Font File','*.CGF',cmLoadFont);
  1305.         cmSaveFont     : TreeWindow ('Save Font File','*.CGF',cmSaveFont);
  1306.         cmLoadPCX      : TreeWindow ('Load PCX File','*.PCX',cmLoadPCX);
  1307.         cmSavePCX      : TreeWindow ('Save PCX File','*.PCX',cmSavePCX);
  1308.         cmSaveConfig   : TreeWindow ('Save Config Stream','*.CFG',cmSaveConfig);
  1309.         cmLoadConfig   : TreeWindow ('Load Config Stream','*.CFG',cmLoadConfig);
  1310.         cmDirChange    : ChangeDir;
  1311.         cmShellToDos   : ShellToDos;
  1312.         cmViewDoc      : ViewTextFile (appDocName);
  1313.         cmAbout        : AboutBox;
  1314.         cmCloseAll     : ClearDeskTop;
  1315.         cmCharSelector : CharSelector;
  1316.         cmScreenOpts   : ScreenOptions;
  1317.         cmColors       : Colors;
  1318.         cmAdjPal       : AdjustPalette;
  1319.         cmRestoreDef   : RestoreDefFont;
  1320.         cmToolBar      : ToolBar;
  1321.         cmBarHelp      : PutEvent (Event)
  1322.       else
  1323.         Exit
  1324.       end;
  1325.       ClearEvent (Event)
  1326.     end;
  1327.     evBroadcast :
  1328.     begin
  1329.       case Event.Command of {process broadcasts}
  1330.         cmCharEdit    : CharEdit (PChrSetEditDlg (Event.InfoPtr));
  1331.         cmCharDelete  : CharDelete (PChrSetEditDlg (Event.InfoPtr));
  1332.         cmCharPaste   : CharPaste (PChrSetEditDlg (Event.InfoPtr));
  1333.         cmCharChanged : CharChanged (PChrEditDlg (Event.InfoPtr));
  1334.         cmCharInvert  : CharInvert (PChrSetEditDlg (Event.InfoPtr));
  1335.         cmCharLeft    : CharLeft (PChrSetEditDlg (Event.InfoPtr));
  1336.         cmCharRight   : CharRight (PChrSetEditDlg (Event.InfoPtr));
  1337.         cmCharUp      : CharUp (PChrSetEditDlg (Event.InfoPtr));
  1338.         cmCharDown    : CharDown (PChrSetEditDlg (Event.InfoPtr));
  1339.         cmLoadFont    : LoadFontFile (PDirWindow (Event.InfoPtr));
  1340.         cmSaveFont    : SaveFontFIle (PDirWindow (Event.InfoPtr));
  1341.         cmLoadPCX     : LoadPCXFile (PDirWindow (Event.InfoPtr));
  1342.         cmSavePCX     : SavePCXFile(PDirWindow (Event.InfoPtr));
  1343.         cmSaveConfig  : SaveConfigFile (PDirWindow (Event.InfoPtr));
  1344.         cmLoadConfig  : LoadConfigFile (PDirWindow (Event.InfoPtr))
  1345.       end
  1346.     end
  1347.   end
  1348. end;
  1349.  
  1350. {
  1351. Assign desk top pattern char, page locations, set default char height from
  1352. bios and save current DAC palette.
  1353. }
  1354.  
  1355. procedure TCyberEdit.InitDeskTop;
  1356.  
  1357. begin
  1358.   SetScreenMode (smCO80);              {make sure 80x25 active}
  1359.   inherited InitDeskTop;
  1360.   DeskTop^.Background^.Pattern := '▒'; {new wall paper}
  1361.   Page := vgaPageLoc[1];
  1362.   PageOfs := vgaPageOfsLoc[1];
  1363.   DefChrHeight := BiosGetChrHeight;
  1364.   GetDACBlock (@DacPalette,0,256)      {save current vga palette}
  1365. end;
  1366.  
  1367. {
  1368. Menu.
  1369. }
  1370.  
  1371. procedure TCyberEdit.InitMenuBar;
  1372.  
  1373. var
  1374.  
  1375.   R : TRect;
  1376.  
  1377. begin
  1378.   GetExtent (R);
  1379.   R.B.Y := R.A.Y+1;
  1380.   MenuBar := New (PMenuBar,Init (R,NewMenu (
  1381.     NewSubMenu ('~F~ile',hcFile,NewMenu (
  1382.     NewSubMenu ('~L~oad',hcLoadFile,NewMenu (
  1383.       NewItem ('~F~ont...','F3',kbF3,cmLoadFont,hcLoadFile,
  1384.       NewItem ('~P~CX...','Shift+F3',kbShiftF3,cmLoadPCX,hcLoadFile,
  1385.       NewItem ('~C~onfig...','Ctrl+F3',kbCtrlF3,cmLoadConfig,hcLoadFile,
  1386.       nil)))),
  1387.     NewSubMenu ('~S~ave',hcSaveFile,NewMenu (
  1388.       NewItem ('~F~ont...','F2',kbF2,cmSaveFont,hcSaveFile,
  1389.       NewItem ('~P~CX...','Shift+F2',kbShiftF2,cmSavePCX,hcSaveFile,
  1390.       NewItem ('~C~onfig...','Ctrl+F2',kbCtrlF2,cmSaveConfig,hcSaveFile,
  1391.       nil)))),
  1392.       NewLine (
  1393.       NewItem ('~C~hange dir...','',kbNoKey,cmDirChange,hcChangeDir,
  1394.       NewItem ('~D~os shell','F9',kbF9,cmShellToDos,hcDosShell,
  1395.       NewItem ('~V~iew doc','',kbNoKey,cmViewDoc,hcViewDoc,
  1396.       NewItem ('~A~bout','',kbNoKey,cmAbout,hcAbout,
  1397.       NewLine (
  1398.       NewItem ('E~x~it','Alt+X',kbAltX,cmQuit,hcExit,
  1399.       nil)))))))))),
  1400.     NewSubMenu('~W~indow',hcWindows,NewMenu(
  1401.       StdWindowMenuItems(
  1402.       NewLine (
  1403.       NewItem ('Selecto~r~','F7',kbF7,cmCharSelector,hcSelector,
  1404.       NewItem ('Tool ~b~ar','Shift+F7',kbShiftF7,cmToolBar,hcToolBar,
  1405.       nil))))),
  1406.     NewSubMenu ('~O~ptions',hcOptions,NewMenu (
  1407.       NewItem ('~S~creen...','',kbNoKey,cmScreenOpts,hcScreen,
  1408.       NewItem ('~C~olors...','',kbNoKey,cmColors,hcOColors,
  1409.       NewItem ('~A~djust palette...','',kbNoKey,cmAdjPal,hcAdjustPalette,
  1410.       NewItem ('~D~efault font','F4',kbNoKey,cmRestoreDef,hcDefaultFont,
  1411.       nil))))),nil))))))
  1412. end;
  1413.  
  1414. {
  1415. Status line.
  1416. }
  1417.  
  1418. procedure TCyberEdit.InitStatusLine;
  1419.  
  1420. var
  1421.  
  1422.   R : TRect;
  1423.  
  1424. begin
  1425.   GetExtent (R);
  1426.   R.A.Y := R.B.Y-1;
  1427.   StatusLine := New (PStatusLine,Init(R,
  1428.     NewStatusDef (0,$FFFF,
  1429.       NewStatusKey ('~F1~ Help', kbF1, cmHelp,
  1430.       NewStatusKey ('~Alt+F3~ Close',kbAltF3,cmClose,
  1431.       NewStatusKey ('~Alt+X~ Exit',kbAltX,cmQuit,
  1432.       NewStatusKey ('',kbF2,cmSaveFont,
  1433.       NewStatusKey ('',kbF3,cmLoadFont,
  1434.       NewStatusKey ('',kbShiftF2,cmSavePCX,
  1435.       NewStatusKey ('',kbShiftF3,cmLoadPCX,
  1436.       NewStatusKey ('',kbCtrlF2,cmSaveConfig,
  1437.       NewStatusKey ('',kbCtrlF3,cmLoadConfig,
  1438.       NewStatusKey ('',kbF4,cmRestoreDef,
  1439.       NewStatusKey ('',kbCtrlF5,cmResize,
  1440.       NewStatusKey ('',kbF7,cmCharSelector,
  1441.       NewStatusKey ('',kbShiftF7,cmToolBar,
  1442.       NewStatusKey ('',kbF10,cmMenu,
  1443.       nil)))))))))))))),nil)))
  1444. end;
  1445.  
  1446. {
  1447. Message when safety pool is cut into.
  1448. }
  1449.  
  1450. procedure TCyberEdit.OutOfMemory;
  1451.  
  1452. begin
  1453.   MessageBox (#3'Not enough memory available to complete operation.  Try closing some windows!',
  1454.   nil,mfError+mfOkButton)
  1455. end;
  1456.  
  1457. {
  1458. Load desk top from stream.
  1459. }
  1460.  
  1461. procedure TCyberEdit.LoadDesktop (var S : TStream);
  1462.  
  1463. var
  1464.  
  1465.   Pal : PString;
  1466.  
  1467. begin
  1468.   Pal := S.ReadStr;
  1469.   if Pal <> nil then
  1470.   begin
  1471.     Application^.GetPalette^ := Pal^;
  1472.     DoneMemory;
  1473.     DisposeStr (Pal)
  1474.   end
  1475. end;
  1476.  
  1477. {
  1478. Store desk top on stream.
  1479. }
  1480.  
  1481. procedure TCyberEdit.StoreDesktop(var S: TStream);
  1482.  
  1483. var
  1484.  
  1485.   Pal: PString;
  1486.  
  1487. begin
  1488.   Pal := @Application^.GetPalette^;
  1489.   S.WriteStr (Pal)
  1490. end;
  1491.  
  1492. {
  1493. If VGA is present then start TV app else print error message.
  1494. }
  1495.  
  1496. var
  1497.  
  1498.   CFApp : TCyberEdit;
  1499.  
  1500. begin
  1501.   if VGACardActive then
  1502.   begin
  1503.     CFApp.Init;
  1504.     SysErrorFunc := AppSystemError;
  1505.     CFApp.Run;
  1506.     CFApp.Done
  1507.   end
  1508.   else
  1509.     PrintStr (#13#10'VGA display required to run CyberEdit!'#13#10);
  1510. end.
  1511.